package org.halk.service.impl;

import org.halk.service.BizService;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * 这里是原始的if else代码
 *
 * @Author zhuhao
 * @Date 2022/2/28 15:02
 * @desc
 */
@Service
public class BizServiceImpl implements BizService {

    /**
     * 传统的 if else 解决方法
     * 当每个业务逻辑有 3 4 行时，用传统的策略模式不值得，直接的if else又显得不易读
     */
    public String getCheckResult(String order) {
        if ("校验1".equals(order)) {
            return "执行业务逻辑1";
        } else if ("校验2".equals(order)) {
            return "执行业务逻辑2";
        } else if ("校验3".equals(order)) {
            return "执行业务逻辑3";
        } else if ("校验4".equals(order)) {
            return "执行业务逻辑4";
        } else if ("校验5".equals(order)) {
            return "执行业务逻辑5";
        } else if ("校验6".equals(order)) {
            return "执行业务逻辑6";
        } else if ("校验7".equals(order)) {
            return "执行业务逻辑7";
        } else if ("校验8".equals(order)) {
            return "执行业务逻辑8";
        } else if ("校验9".equals(order)) {
            return "执行业务逻辑9";
        }
        return "不在处理的逻辑中返回业务错误";
    }

    /**
     * 业务逻辑分派Map
     * Function为函数式接口，下面代码中 Function<String, String> 的含义是接收一个Stirng类型的变量，返回一个String类型的结果
     */
    private Map<String, Function<String, String>> checkResultDispatcher = new HashMap<>();

    /**
     * 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
     */
    @PostConstruct
    public void checkResultDispatcherInit() {
        checkResultDispatcher.put("2", key -> String.format("对%s执行业务逻辑1", key));
        checkResultDispatcher.put("3", key -> String.format("对%s执行业务逻辑2", key));
        checkResultDispatcher.put("4", key -> String.format("对%s执行业务逻辑3", key));
        checkResultDispatcher.put("5", key -> String.format("对%s执行业务逻辑4", key));
        checkResultDispatcher.put("1", key -> String.format("对%s执行业务逻辑5", key));
    }

    @Override
    public String getCheckResultSuper(String key) {
        //从逻辑分派Dispatcher中获得业务逻辑代码，result变量是一段lambda表达式
        Function<String, String> result = checkResultDispatcher.get(key);
        if (result != null) {
            //执行这段表达式获得String类型的结果
            return result.apply(key);
        }
        return "不在处理的逻辑中返回业务错误";
    }
}
